package com.springboot.middleware.middleware_redisson.server.redisson;

import com.springboot.middleware.middleware_redisson.server.dto.DeadDto;
import org.redisson.api.RBlockingDeque;
import org.redisson.api.RedissonClient;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

/**
 * Redisson延迟队列消息模型-消费者
 */
@Component
@EnableScheduling
public class RedissonDelayQueueConsumer {
    private static final Logger log = LoggerFactory.getLogger(RedissonDelayQueueConsumer.class);

    @Autowired
    private RedissonClient redissonClient;

    /**
     * 监听消费真正队列中的消息
     * 每时每刻都在不断地监听 (每秒监听一次)
     *      * 第一位，表示秒，取值0-59
     *      * 第二位，表示分，取值0-59
     *      * 第三位，表示小时，取值0-23
     *      * 第四位，日期天/日，取值1-31
     *      * 第五位，日期月份，取值1-12
     *      * 第六位，星期，取值1-7，星期一，星期二...，注：不是第1周，第二周的意思
     *           另外：1表示星期天，2表示星期一。
     *      * 第7为，年份，可以留空，取值1970-2099
      */
    @Scheduled(cron = "*/1 * * * * ?")
    public void consumeMsg() throws Exception{
        final String delayQueueName = "redissonDelayQueue";
        RBlockingDeque<DeadDto> rBlockingDeque = redissonClient.getBlockingDeque(delayQueueName);
        DeadDto msg = rBlockingDeque.take();
        if (msg != null) {
            log.info("Redisson延迟队列消息模型 - 消费者 - 从延迟队列中取出消息 - 消息: {}", msg);
            // TODO: 2022/1/29 这里执行相应的业务逻辑 
        }
    }
}
